package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 通过提高每次读写的数据量,减少实际读写的次数可以提高读写效率
 * 一次读写一个字节的形式是一种随机读写形式.
 * 而一次读写一组字节的形式是块读写形式.
 *
 *
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis
                = new FileInputStream("e:/Git.exe");
        FileOutputStream fos
                = new FileOutputStream("e:/Git_cp.exe");

        /*
            块读:
            int read(byte[] data)
            一次性读取给定的字节数组总长度的字节量并存入到该数组中,
            返回值为实际读取到的字节量,若返回值为-1则表示读取到了末尾.

            void write(byte[] data)
            一次性将给定的字节数组中所有字节写出.

            void write(byte[] data,int offset,int len)
            将给定的字节数组从下标offset处开始的连续len个字节一次性写出


            原文件数据:
            11001010 00001111 11110000 10101010 10101010 文件末尾
            ^^^^^^^^ ^^^^^^^^ ^^^^^^^^

            3字节数组
            byte[3] data:[00000000 00000000 00000000]

            d = fis.read(data);//块读操作
            data:[11001010 00001111 11110000]
            d:3(10进制)

            fos.write(data);
            复制文件:
            11001010 00001111 11110000

         */
        /*
            00000000 8位2进制  1byte  1字节
            1024byte  1kb
            1024kb    1mb
            1024mb    1gb
            1024gb    1tb
         */
        byte[] data = new byte[1024*10];//10kb
        int len;//每次读取到的字节量

        long start = System.currentTimeMillis();
        while((len = fis.read(data))!=-1){
            fos.write(data,0,len);
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕!耗时:"+(end-start)+"ms");

        fis.close();
        fos.close();

    }
}
